/*
* Copyright 2015 MovingBlocks
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.terasology.master;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.jetty.server.Server;
import org.h2.jdbcx.JdbcDataSource;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.rules.TemporaryFolder;
import org.terasology.web.JettyMain;
import org.terasology.web.artifactory.ArtifactRepository.RepoType;
import org.terasology.web.db.DataBase;
import org.terasology.web.db.JooqDatabase;
import org.terasology.web.geo.GeoLocation;
import org.terasology.web.geo.GeoLocationService;
import org.terasology.web.model.ModuleListModelImpl;
import org.terasology.web.model.ServerEntry;
import org.terasology.web.model.ServerListModel;
import org.terasology.web.model.ServerListModelImpl;
import org.terasology.web.servlet.AboutServlet;
import org.terasology.web.servlet.ModuleServlet;
import org.terasology.web.servlet.ServerServlet;
public abstract class WebServerBasedTests {
@ClassRule
public static TemporaryFolder tempFolder = new TemporaryFolder();
protected static final int PORT = 8082;
protected static final String URL_BASE = "http://localhost:" + PORT;
protected static final String SERVER_TABLE = "servers";
protected static ServerEntry firstEntry;
private static DataBase dataBase;
private static Server webServer;
private static Connection dummyConn;
private static AtomicInteger atomCount = new AtomicInteger();
private static DummyArtifactRepo releaseRepo;
private static DummyArtifactRepo snapshotRepo;
@BeforeClass
public static void setup() throws Exception {
String secret = "edit";
// make a unique database for each testing class
String dbUri = "jdbc:h2:mem:test_" + atomCount.getAndIncrement();
JdbcDataSource ds = new JdbcDataSource();
ds.setURL(dbUri);
GeoLocationService geoService = new DummyGeoLocationService();
// Open a dummy connection to the in-memory database to keep it alive
dummyConn = DriverManager.getConnection(dbUri);
dataBase = new JooqDatabase(ds, geoService);
File cacheFolder = tempFolder.newFolder("module", "cache");
ModuleListModelImpl moduleListModel = new ModuleListModelImpl(cacheFolder.toPath(), new DummyExtractor());
releaseRepo = new DummyArtifactRepo(RepoType.RELEASE);
addRelease("Core", "Core-0.53.1.jar_info.json");
snapshotRepo = new DummyArtifactRepo(RepoType.SNAPSHOT);
addSnapshot("ChrisVolume1OST", "ChrisVolume1OST-0.2.1-20150608.034649-1.jar_info.json");
addSnapshot("MusicDirector", "MusicDirector-0.2.1-20150608.041945-1.jar_info.json");
moduleListModel.addRepository(releaseRepo);
moduleListModel.addRepository(snapshotRepo);
moduleListModel.updateAllModules();
ServerListModel serverListModel = new ServerListModelImpl(dataBase, SERVER_TABLE, secret);
webServer = JettyMain.createServer(PORT,
new AboutServlet(),
new ServerServlet(serverListModel), // the server list servlet
new ModuleServlet(moduleListModel)); // the module list servlet
webServer.start();
dataBase.createTable(SERVER_TABLE);
GeoLocation geo = geoService.resolve("localhost");
firstEntry = new ServerEntry("localhost", 25000);
firstEntry.setName("myName");
firstEntry.setOwner("Tester");
firstEntry.setCountry(geo.getCountry());
firstEntry.setStateprov(geo.getStateOrProvince());
firstEntry.setCity(geo.getCity());
dataBase.insert(SERVER_TABLE, firstEntry);
}
protected static void addRelease(String modName, String fname) throws IOException {
releaseRepo.addArtifact(modName, new ClasspathArtifactInfo("/metas/" + fname));
}
protected static void addSnapshot(String modName, String fname) throws IOException {
snapshotRepo.addArtifact(modName, new ClasspathArtifactInfo("/metas/" + fname));
}
@AfterClass
public static void shutdown() throws Exception {
webServer.stop();
dummyConn.close();
}
}